use regex::{Regex, RegexBuilder};
use regex_syntax::hir::Hir;
use regex_syntax::{parse, Parser, ParserBuilder};

fn main() {
    println!("Hello, world!");

    // regex 官方文档 https://docs.rs/regex/1.10.6/regex/
    // regex crate 提供了正则表达式的匹配、搜索、替换、分割等功能
    let re = Regex::new(r"(?x)
(?P<year>\d{4})  # the year
-
(?P<month>\d{2}) # the month
-
(?P<day>\d{2})   # the day
").unwrap();

    let caps = re.captures("2010-03-14").unwrap();
    assert_eq!("2010", &caps["year"]);
    assert_eq!("03", &caps["month"]);
    assert_eq!("14", &caps["day"]);


    // 创建一个正则表达式，匹配日期字符串，并提取年、月、日三个字段
    let re = Regex::new(r"(\d{4})-(\d{2})-(\d{2})").unwrap();
    let hay = "On 2010-03-14, foo happened. On 2014-10-14, bar happened.";
    let mut dates = vec![];
    for (_, [year, month, day]) in re.captures_iter(hay).map(|c| c.extract()) {
        dates.push((year, month, day));
    }
    assert_eq!(dates, vec![
        ("2010", "03", "14"),
        ("2014", "10", "14"),
    ]);


    // 正则表达式的可配置构建器。
    // 它可以用来创建复杂的正则表达式，包括多行模式、忽略大小写、Unicode 支持等。
    let regex = RegexBuilder::new(r"\w")
        .unicode(false)
        .multi_line(true)
        .build()
        .unwrap();
    // 通常希腊字母会包含在 \w 中，但由于Unicode 模式已禁用，它仅匹配 ASCII 字母。
    assert!(!regex.is_match("δ"));



    // regex_syntax 官方文档 https://docs.rs/regex-syntax/latest/regex_syntax/index.html
    // regex_syntax crate 提供了正则表达式语法解析的功能，可以将正则表达式解析为 HIR（High-level Intermediate Representation）
    // HIR 是一个内部表示，它是编译器和解释器之间的中间表示。
    // HIR 包含了正则表达式的语法树，它可以被编译器和解释器用来执行正则表达式的匹配操作。
    let hir = parse("a|b").unwrap();
    assert_eq!(hir, Hir::alternation(vec![
        Hir::literal("a".as_bytes()),
        Hir::literal("b".as_bytes()),
    ]));

    // 自定义正则表达式语法解析器
    let mut parser = ParserBuilder::new()
        .unicode(true)
        .build();


    let hir = parser.parse("(?x) \n (?P<year>\\d{4}) - (?P<month>\\d{2}) - (?P<day>\\d{2}) ").unwrap();

    // 正则表达式的便捷解析器
    // 它可以用来解析一些常见的正则表达式模式，例如日志文件中的行号、文件名、日志等。
    // 创建一个正则表达式
    let regex = Regex::new(r"(?m)^([^:]+):([0-9]+):(.+)$").unwrap();
    // 创建一个便捷解析器，定义正则表达式的高级中间（HIR）表示法。
    let parser = Parser::new().parse(r"(?m)^([^:]+):([0-9]+):(.+)$").unwrap();
    // 解析日志文件
    let hay = "file1.txt:123: this is a message\nfile2.txt:456: another message\n";
    for cap in regex.captures_iter(hay) {
        let file = cap.get(1).unwrap().as_str();
        let line = cap.get(2).unwrap().as_str().parse().unwrap();
        let message = cap.get(3).unwrap().as_str();
        println!("{}:{}: {}", file, line, message);
    }
}
